/**
 * 符号类型
 */
export const enum TokenType {
  /**
   * 空白字符
   */
  WhiteSpace,

  /**
   * 整数
   */
  Integer,

  /**
   * 大整数
   */
  BigInt,

  /**
   * 浮点数
   */
  Double,

  /**
   * 字符串
   */
  String,

  /**
   * 未知字符
   */
  Unkown,

  /**
   * 结束
   */
  End
}


export const findNumber = (lexer: Lexer) => {

}

export const findSingleQuoteString = (lexer: Lexer) => {

};

export const findDoubleQuoteString = (lexer: Lexer) => {

};

export const findRegex = (lexer: Lexer) => {

};



export interface Operator {
  
}


/**
 * 记法分析器
 */
export class Lexer {

  /**
   * 代码
   */
  readonly code: string;

  /**
   * 当前 Token 开始位置
   */
  readonly start: number;

  /**
   * 当前 Token 内容
   */
  readonly currentToken: {
    type: TokenType,
    text: string
  };


  constructor(code: string) {
    this.code = code;
    this.start = 0;
    this.currentToken = {
      type: TokenType.WhiteSpace,
      text: ''
    };
  }


  /**
   * 移动到下一个 Token
   * 
   * @param context 上下文
   */
  next() {
    let index = this.start;
    let code = this.code;
    let char;

    // 有字符
    if ((char = code.charCodeAt(index)) >= 0) {
      // 空白字符
      if (char === 32 || char > 8 && char < 14) {
        (this as any).currentTokenType = TokenType.WhiteSpace;
        return;
      }

      // let find = context.tokenizer[char];

      // if (find) {
      //   find(this);
      //   return;
      // }

      return;
    }
  }
}
